package com.lenovo.leos.filebrowser.netdisk;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;

import android.content.Context;

import com.lenovo.leos.letools.exception.NetException;
import com.lenovo.leos.letools.exception.PreUploadException;
import com.lenovo.leos.letools.lenovodata.DownLoadServer;
import com.lenovo.leos.letools.lenovodata.UploadDirServer;
import com.lenovo.leos.letools.lenovodata.UploadServer;

public class LoadNetDiskOpThread extends Thread {
	private static final String TAG = "LoadNetDiskOpThread";

	private boolean mbStop = false;
	private boolean mbNeedNotify = false;

	private LinkedList<LoadNetDiskOp> mllOps = null;
	private HashMap<Long, NetDiskOp> mhmDone = null;
	private HashMap<Long, NetDiskOp> mhmRuning = null;
	private ArrayList<NetDiskOp> maaRuning = null;
	private Context mContext = null;
	UploadServer mulServer = null;
	DownLoadServer mdlServer = null;

	int totalProgress = 0;
	int totalProgressDir = 0;
	int uploadFileTotal = 0;
	int uploadDirTotal = 0;

	public LoadNetDiskOpThread(Context context,
			LinkedList<LoadNetDiskOp> oplist, HashMap<Long, NetDiskOp> hmDone,
			HashMap<Long, NetDiskOp> hmRuning) {
		if (null == context || null == oplist || null == hmDone
				|| null == hmRuning) {
			Log.e(TAG, "invalid parameter in LoadNetDiskOpThread");
			return;
		} else {
			mllOps = oplist;
			mhmDone = hmDone;
			mContext = context;
			mhmRuning = hmRuning;
			maaRuning = new ArrayList<NetDiskOp>();
			mdlServer = DownLoadServer.getInstance(mContext);
			mulServer = UploadServer.getInstance(mContext);
			totalProgress = 0;
		}
	}

	public void toStop() {
		if (!mbStop)
			mbStop = true;
	}

	public long getProgress() {
		return 10;
	}
  
	public void setEnableNotify(boolean enable) {
		mbNeedNotify = enable;
	}
  
	private void doDownloadFile(LoadNetDiskOp op) {
//		try {
//
//			Log.i(TAG, "==>doDownloadFile");
//			String strid = op.getData().getString("fileid");
//			String strfileName = op.getData().getString("filename");
//			String strDownLoadPath = op.getData().getString("downLoadPath");
//			// strDownLoadPath = strDownLoadPath + "/" + strfileName;
//			Log.i(TAG, "==>doDownloadFile ==>" + strDownLoadPath);
//			Log.i(TAG, "==>doDownloadFile1");
//			mdlServer.createLoadTask(strid, strDownLoadPath, null);
//			Log.i(TAG, "==>doDownloadFile2");
//			mdlServer.startDownLoadThreadByFile(strid, null);
//			Log.i(TAG, "==>doDownloadFile3");
//			op.setState(LoadNetDiskOp.State.run);
//			boolean nbflag = true;
//			while (nbflag) {
//				double tempdata = mdlServer.getTotalSize(strid);
//				if (tempdata != 0) {
//					Log.i(TAG, "==>getTotalSize" + tempdata);
//					op.setTotalLength(tempdata);
//					nbflag = false;
//				}
//				Thread.sleep(1000);
//			}
//		} catch (Exception e) {
//			Log.i(TAG, "==>getTotalSize Error");
//			e.printStackTrace();
//		}
//		Log.i(TAG, "==>doDownloadFile endingxxx");
	}

	private void doDownloadDir(LoadNetDiskOp op) {
//		try {
//
//			Log.i(TAG, "==>doDownloadFile");
//			String strDirid = op.getData().getString("dirid");
//			String strDirName = op.getData().getString("dirname");
//			String strDirDownLoadPath = op.getData().getString("downLoadPath");
//			// strDownLoadPath = strDownLoadPath + "/" + strfileName;
//			
//			  
//			Log.i(TAG, "==>doDownloadFile" + strDirid + "strDirName"
//					+ strDirName + "strDirDownLoadPath" + strDirDownLoadPath);
//			mdlServer.createLoadTaskDir(strDirid, strDirName,strDirDownLoadPath);
//			
//			int DirTotalLength =mdlServer.getDirTotalLen(strDirid);
//			op.setTotalLength(DirTotalLength);
//			mdlServer.startDownLoadThreadByDir(strDirid, null);
//			op.setState(LoadNetDiskOp.State.run);
//			
//			// boolean nbflag = true;
//			// while (nbflag) {
//			// double tempdata = mdlServer.getTotalSize(strDirid);
//			// if (tempdata != 0) {
//			// Log.i(TAG, "==>getTotalSize" + tempdata);
//			// op.setTotalLength(tempdata);
//			// nbflag = false;
//			// }
//			// Thread.sleep(1000);
//			// }   
//		} catch (Exception e) {
//			Log.i(TAG, "==>getTotalSize Error");
//			e.printStackTrace();
//		}
//		Log.i(TAG, "==>doDownloadDir endingxxx");
	}

	private void doUploadFile(LoadNetDiskOp op) {
		Log.i(TAG, "doUploadFile>>>>>>>>>> "+op.getID());
		String strDirId = op.getData().getString("DirId");
		String strwholePath = op.getData().getString("Path");
		Log.i(TAG, "doUploadFile>>>>>>>>>> " + strwholePath);
		Log.i(TAG, "doUploadFile>>>>>>>>>> " + strDirId);
		File file = new File(strwholePath);
		String strNewName = file.getName();
		op.setTotalLength(file.length());
		long upfilesize = file.length();
		try {
			mulServer.createTask(strwholePath, strDirId, strNewName, null);
		} catch (NetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (PreUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//modify by gaoge ,don't know where use here
		mulServer.startUpload(strwholePath, null,null,-1);
		op.setState(LoadNetDiskOp.State.run);
	}
  
	private void doUploadDir(LoadNetDiskOp op) {
//		Log.i(TAG, "doUploadFile>>>>>>>>>> ");
//		String strParentDirId = op.getData().getString("parentDirId");
//		String strwholePath = op.getData().getString("dirWholepath");
//		try {
//			Log.i(TAG, "strParentDirId IS: " + strParentDirId
//					+ "strwholePath IS" + strwholePath);
//			mulServer.createDirTask(strwholePath, strParentDirId);
//			op.setTotalLength(mulServer.getUpLoadTotalLen(strwholePath));
//			mulServer.startDirUpload(strwholePath, null);
//			op.setState(LoadNetDiskOp.State.run);  
//		} catch (NetException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (PreUploadException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
  
	}
    
	public void pauseLoad(LoadNetDiskOp op) {
//		Log.i(TAG, "==>pauseLoad");
//		long workID = op.getData().getLong("OpID");
//		LoadNetDiskOp cop = (LoadNetDiskOp) mhmRuning.get(workID);
//		if(cop.getType() == LoadNetDiskOp.Type.download_file){
//			cop.setState(LoadNetDiskOp.State.pause);
//			mdlServer.pauseDownLoadThread(cop.getData().getString("fileid"));
//		}else if(cop.getType() == LoadNetDiskOp.Type.download_dir){
//			cop.setState(LoadNetDiskOp.State.pause);
//			mdlServer.pauseDownLoadThread(cop.getData().getString("dirid"));
//		}else if(cop.getType() == LoadNetDiskOp.Type.upload_file){
//			cop.setState(LoadNetDiskOp.State.pause);
//			mulServer.pauseUpload(cop.getData().getString("Path"));
//		}else if(cop.getType() == LoadNetDiskOp.Type.upload_dir){
//			cop.setState(LoadNetDiskOp.State.pause);
//			mulServer.pauseDirUpload(cop.getData().getString("dirWholepath"));
//		}
	}

	public void resumeLoad(LoadNetDiskOp op) {
//		Log.i(TAG, "==>resumeLoad");
//		long workID = op.getData().getLong("OpID");
//		LoadNetDiskOp cop = (LoadNetDiskOp) mhmRuning.get(workID);
//		if(cop.getType() == LoadNetDiskOp.Type.download_file){
//			cop.setState(LoadNetDiskOp.State.run);
//			int filelen = mdlServer.getCurrentFileLen(cop.getData().getString(
//					"fileid"));
//			totalProgress = filelen;
//			Log.i(TAG, "=============>>>>file length" + filelen);
//			cop.setProgress(filelen);
//			mdlServer.startDownLoadThreadByFile(cop.getData().getString("fileid"),
//					null);
//			}else if(cop.getType() == LoadNetDiskOp.Type.download_dir){
//				cop.setState(LoadNetDiskOp.State.run);
//				String strDirId = cop.getData().getString("dirid");
//				  
//				int dirtotallen = mdlServer.getCurDirTotalLen(strDirId);
//				totalProgressDir = dirtotallen;
//				cop.setProgress(totalProgressDir);
//				mdlServer.startDownLoadThreadByDir(strDirId,null);
//			}else if(cop.getType() == LoadNetDiskOp.Type.upload_file){
//				cop.setState(LoadNetDiskOp.State.run);
//				String strwholePath = cop.getData().getString("Path");
//				String strDirId = cop.getData().getString("DirId");
//				Log.i(TAG, "=============>>>>file length" + strwholePath+"===========>>dir id"+strDirId+"==opid");
//				
//				int fileUpLoaddata = mulServer.getUpLoadFileProgTotalLen(strwholePath);
//				uploadFileTotal = fileUpLoaddata;
//				cop.setProgress(uploadFileTotal);
//				mulServer.startUpload(strwholePath,null);
//				
//			}else if(cop.getType() == LoadNetDiskOp.Type.upload_dir){
//				
//				cop.setState(LoadNetDiskOp.State.run);
//				String strwholePath = cop.getData().getString("dirWholepath");
//				Log.i(TAG, "=============>>>>upload dir" + strwholePath);
//				int fileUpLoaddata = mulServer.getUpLoadProgTotalLen(strwholePath);
//				uploadFileTotal = fileUpLoaddata;
//				cop.setProgress(uploadFileTotal);
//				mulServer.startUpload(strwholePath,null);
//			}
		
	}

	public void cancelLoad(LoadNetDiskOp op) {
//		Log.i(TAG, "==>cancelLoad");
//		long workID = op.getData().getLong("OpID");
//		LoadNetDiskOp cop = (LoadNetDiskOp) mhmRuning.remove(workID);
//		if(cop.getType() ==LoadNetDiskOp.Type.download_file){
//			for (int i = 0; i < maaRuning.size(); i++) {
//				if (maaRuning.get(i).getID() == workID) {
//					maaRuning.remove(i);
//				}
//			}
//			mdlServer.pauseDownLoadThread(cop.getData().getString("fileid"));
//			mdlServer.deleteTask(cop.getData().getString("fileid"));
//			mhmRuning.remove(workID);
//		}else if(cop.getType() ==LoadNetDiskOp.Type.download_dir){
//			for (int i = 0; i < maaRuning.size(); i++) {
//				if (maaRuning.get(i).getID() == workID) {
//					maaRuning.remove(i);
//				}
//			}
//			
//			mdlServer.pauseDownLoadThread(cop.getData().getString("dirid"));
//			mdlServer.deleteDir(cop.getData().getString("dirid"));
//			mhmRuning.remove(workID);
//		}else if(cop.getType() ==LoadNetDiskOp.Type.upload_file ){
//			for (int i = 0; i < maaRuning.size(); i++) {
//				if (maaRuning.get(i).getID() == workID) {
//					maaRuning.remove(i);
//				}
//			}
//			
//			mulServer.pauseUpload(cop.getData().getString("Path"));
//			mulServer.deleteUpLoadTask(cop.getData().getString("Path"));
//			mhmRuning.remove(workID);
//		}else if(cop.getType() ==LoadNetDiskOp.Type.upload_dir){
//			for (int i = 0; i < maaRuning.size(); i++) {
//				if (maaRuning.get(i).getID() == workID) {
//					maaRuning.remove(i);
//				}
//			}
//			mulServer.pauseDirUpload(cop.getData().getString("dirWholepath"));
//			//del
//			mulServer.deleteUpLoadDirTask(cop.getData().getString("dirWholepath"));
//			mhmRuning.remove(workID);
//		}
		
	}

	public void cancelLoadAll() {
//		Log.i(TAG, "==>cancelLoadAll");
//		for (int i = 0; i < maaRuning.size(); i++) {
//			mhmRuning.remove(maaRuning.get(i).getID());
//			maaRuning.remove(i);
//		}
//		Log.i(TAG, "==>run server delete all");
//		mdlServer.deleteAll();
	}

	public void stopLoad(LoadNetDiskOp op) {

	} 
  
	public void run() {
//		while (!mbStop) {
//
//			if (null == mllOps || 0 == mllOps.size()) {
//				try {
//					Thread.sleep(200);
//				} catch (InterruptedException e1) {
//					e1.printStackTrace();
//				}
//				// updata the ops data
//				if (null == mhmRuning || 0 == mhmRuning.size()) {
//				} else {
//					for (int i = 0; i < maaRuning.size(); i++) {
//						LoadNetDiskOp sop = (LoadNetDiskOp) maaRuning.get(i);
//						if (sop.getType() == LoadNetDiskOp.Type.download_file) {
//							String strFileID = maaRuning.get(i).getData()
//									.getString("fileid");
//							Log.i(TAG, "<<<<<<<<<<<<" + strFileID);
//							double prog = mdlServer.getProgess(strFileID);
//							if (prog == 0.000) {
//
//							} else if (prog == -2.000) {
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								op.setState(LoadNetDiskOp.State.finish);
//								Log.e("GETPROGESS",
//										">>>>>>>>>>>DOWN LOAD ENDING"
//												+ strFileID);
//							} else if (prog == -3.000) {
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								op.setState(LoadNetDiskOp.State.error);
//								Log.e("GETPROGESS",
//										">>>>>>>>>>>DOWN LOAD ERROR"
//												+ strFileID);
//							} else if(prog == -4.00){
//								
//							}else{
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								if (op.getProgress() < prog) {
//									op.setProgress(prog);
//								} else {
//									op.setProgress(totalProgress + prog); 
//								}
//								Log.e("GETPROGESS", ">>>>>>>>>>>PRO" + prog);
//							}
//						} else if (sop.getType() == LoadNetDiskOp.Type.upload_file) {
//							String strPath = maaRuning.get(i).getData()
//									.getString("Path");
//							double progress = mulServer.getProgess(strPath);
//							if (progress == 0.000) {
//
//							} else if (progress == -2.000) {
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								op.setState(LoadNetDiskOp.State.finish);
//								Log.e("GETPROGESS", ">>>>>>>>>>>UP LOAD ENDING"
//										+ strPath);
//							} else if (progress == -3.000) {
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								op.setState(LoadNetDiskOp.State.error);
//								
//							} else {
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								if (op.getProgress() < progress) {
//									op.setProgress(progress);
//								} else {
//									op.setProgress(totalProgressDir + progress);
//								}
//								Log.e("GETPROGESS", "UP>>>>>>>>>>>PRO"
//										+ progress);
//							}    
//						} else if (sop.getType() == LoadNetDiskOp.Type.download_dir) {
//							  
//							Log.i(TAG, "<<<<<<<<<<<<download_dir progess");
//							String strDirID = maaRuning.get(i).getData()
//									.getString("dirid");
//							Log.i(TAG, "<<<<<<<<<<<<" + strDirID);
//							double prog = mdlServer.getProgess(strDirID);
//							if (prog == 0.000) {
//
//							} else if (prog == -2.000) {
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								op.setState(LoadNetDiskOp.State.finish);
//								Log.e("GETPROGESS",
//										">>>>>>>>>>>DOWN LOAD ENDING"
//												+ strDirID);
//							} else if (prog == -3.000) {
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								op.setState(LoadNetDiskOp.State.error);
//								Log.e("GETPROGESS",
//										">>>>>>>>>>>DOWN LOAD ERROR"
//												+ strDirID);
//							} else {
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								if (op.getProgress() < prog) {
//									op.setProgress(prog);
//								} else {
//									op.setProgress(uploadFileTotal + prog);
//								}
//								Log.e("GETPROGESS", ">>>>>>>>>>>PRO DIR" + prog);
//							}
//						}else if(sop.getType() == LoadNetDiskOp.Type.upload_dir){
//							Log.i(TAG, "<<<<<<<<<<<<upload_dir progess");
//							String strDirWohoPath = maaRuning.get(i).getData()
//									.getString("dirWholepath");
//							Log.i(TAG, "<<<<<<<<<<<<" + strDirWohoPath);
//							double prog = mulServer.getProgess(strDirWohoPath);
//							if (prog == 0.000) {
//
//							} else if (prog == -2.000) {
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								op.setState(LoadNetDiskOp.State.finish);
//								Log.e("GETPROGESS",
//										">>>>>>>>>>>UP LOAD ENDING"
//												+ strDirWohoPath);
//							} else if (prog == -3.000) {
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								op.setState(LoadNetDiskOp.State.error);
//								Log.e("GETPROGESS",
//										">>>>>>>>>>>UP LOAD ERROR"
//												+ strDirWohoPath);
//							} else {
//								LoadNetDiskOp op = (LoadNetDiskOp) mhmRuning
//										.get(maaRuning.get(i).getID());
//								if (op.getProgress() < prog) {
//									op.setProgress(prog);
//								} else {
//									op.setProgress(uploadDirTotal + prog);
//								}
//								Log.e("GETPROGESS", ">>>>>>>>>>>PRO DIR" + prog);
//							}
//						}
//					}  
//					/**
//					 * up load progess
//					 */
//					for (int i = 0; i < maaRuning.size(); i++) {
//
//					}
//
//				}
//			} else {
//				LoadNetDiskOp nextOp = null;
//
//				// get the next op
//				while (true) {
//					if (0 == mllOps.size()) {
//						Log.i(TAG, "no op in stack");
//						break;
//					} else {
//						LoadNetDiskOp sop = null;
//						if (!mllOps.isEmpty()) {
//							sop = mllOps.removeFirst();
//						} else {
//							sop = null;
//						}
//						if (null == sop) {
//							Log.e(TAG, "no op in stack but size is not zero");
//							break;
//						} else {
//							if (LoadNetDiskOp.State.ready == sop.getState()) {
//								nextOp = sop;
//
//								break;
//							} else if (LoadNetDiskOp.State.finish == sop
//									.getState()) {
//								// mhmRuning.remove(sop.getID());
//								// maaRuning.remove(sop);
//								continue;
//							} else {
//								Log.e(TAG, "the op state is invalid");
//								continue;
//							}
//						}
//					}
//				}
//
//				if (null == nextOp)
//					continue;
//				LoadNetDiskOp lop = (LoadNetDiskOp) nextOp;
//				LoadNetDiskOp.Type type = lop.getType();
//
//				if (LoadNetDiskOp.Type.download_file == type) {
//					mhmRuning.put(lop.getID(), lop);
//					maaRuning.add(lop);
//					doDownloadFile(lop);
//				} else if (LoadNetDiskOp.Type.download_dir == type) {
//					mhmRuning.put(lop.getID(), lop);
//					maaRuning.add(lop);
//					doDownloadDir(lop);
//				} else if (LoadNetDiskOp.Type.upload_file == type) {
//					mhmRuning.put(lop.getID(), lop);
//					maaRuning.add(lop);
//					doUploadFile(lop);
//				} else if (LoadNetDiskOp.Type.upload_dir == type) {
//					mhmRuning.put(lop.getID(), lop);
//					maaRuning.add(lop);
//					doUploadDir(lop);
//				} else if (LoadNetDiskOp.Type.do_pause == type) {
//					pauseLoad(lop);
//				} else if (LoadNetDiskOp.Type.do_run == type) {
//
//				} else if (LoadNetDiskOp.Type.do_start == type) {
//					resumeLoad(lop);
//				} else if (LoadNetDiskOp.Type.do_ready == type) {
//
//				} else if (LoadNetDiskOp.Type.do_stop == type) {
//					stopLoad(lop);
//				} else if (LoadNetDiskOp.Type.do_clean == type) {
//					cancelLoad(lop);
//				} else if (LoadNetDiskOp.Type.do_clean_all == type) {
//					cancelLoadAll();
//				} else {
//
//				}
//
//				// check the state of op, if it is running
//				// move it to mhmRuning
//			}
//		}
	}
  
}